package com.ocss.system.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.ocss.common.core.domain.entity.SysUser;
import com.ocss.common.utils.DateUtils;
import com.ocss.common.utils.SecurityUtils;
import com.ocss.system.domain.OcssElectiveCourses;
import com.ocss.system.domain.OcssStudent;
import com.ocss.system.mapper.OcssElectiveCoursesMapper;
import com.ocss.system.mapper.OcssStudentMapper;
import com.ocss.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.init.ScriptUtils;
import org.springframework.stereotype.Service;
import com.ocss.system.mapper.OcssCourseMapper;
import com.ocss.system.domain.OcssCourse;
import com.ocss.system.service.IOcssCourseService;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * 课程信息Service业务层处理
 *
 * @author ligen
 * @date 2024-03-06
 */
@Service
public class OcssCourseServiceImpl implements IOcssCourseService {
    @Autowired
    private OcssCourseMapper ocssCourseMapper;

    @Resource
    private SysUserMapper sysUserMapper;

    @Resource
    private OcssElectiveCoursesMapper electiveCoursesMapper;

    @Resource
    private OcssStudentMapper studentMapper;

    /**
     * 查询课程信息
     *
     * @param id 课程信息主键
     * @return 课程信息
     */
    @Override
    public OcssCourse selectOcssCourseById(Long id) {
        return ocssCourseMapper.selectOcssCourseById(id);
    }

    /**
     * 查询课程信息列表
     *
     * @param ocssCourse 课程信息
     * @return 课程信息
     */
    @Override
    @Transactional
    public List<OcssCourse> selectOcssCourseList(OcssCourse ocssCourse) {

        Long userId = SecurityUtils.getUserId();

        SysUser user = sysUserMapper.selectUserById(userId);

        Long pid = user.getPid();

        if (pid != 0) {
            ocssCourse.setTeacherId(pid);
        }

        List<OcssCourse> ocssCourses = ocssCourseMapper.selectOcssCourseList(ocssCourse);

        for (OcssCourse course : ocssCourses) {
            Date courseEndTime = course.getCourseEndTime();
            Date currentDate = new Date();

            if (courseEndTime.before(currentDate)) {
                course.setStatus("3");
                ocssCourseMapper.updateOcssCourse(course);
            } else if (course.getRemainingCourses() == 0) {
                ocssCourseMapper.updateOcssCourse(course);
                course.setStatus("2");
            }
        }


        return ocssCourses;
    }

    /**
     * 新增课程信息
     *
     * @param ocssCourse 课程信息
     * @return 结果
     */
    @Override
    public int insertOcssCourse(OcssCourse ocssCourse) {
        ocssCourse.setCreateTime(DateUtils.getNowDate());

        ocssCourse.setRemainingCourses(ocssCourse.getCourseNumber());

        return ocssCourseMapper.insertOcssCourse(ocssCourse);
    }

    /**
     * 修改课程信息
     *
     * @param ocssCourse 课程信息
     * @return 结果
     */
    @Override
    public int updateOcssCourse(OcssCourse ocssCourse) {
        ocssCourse.setUpdateTime(DateUtils.getNowDate());
        return ocssCourseMapper.updateOcssCourse(ocssCourse);
    }

    /**
     * 批量删除课程信息
     *
     * @param ids 需要删除的课程信息主键
     * @return 结果
     */
    @Override
    public int deleteOcssCourseByIds(Long[] ids) {
        return ocssCourseMapper.deleteOcssCourseByIds(ids);
    }

    /**
     * 删除课程信息信息
     *
     * @param id 课程信息主键
     * @return 结果
     */
    @Override
    public int deleteOcssCourseById(Long id) {
        return ocssCourseMapper.deleteOcssCourseById(id);
    }

    // 查询课程详情（学生列表）
    @Override
    public List<OcssStudent> selectOcssCourseDetailList(OcssCourse ocssCourse, Long id) {

        OcssElectiveCourses ocssElectiveCourses = new OcssElectiveCourses();
        ocssElectiveCourses.setCourseId(id);

        List<OcssElectiveCourses> electiveCoursesList = electiveCoursesMapper.selectOcssElectiveCoursesList(ocssElectiveCourses);

        if (!electiveCoursesList.isEmpty()) {

            Long[] sids = electiveCoursesList.stream()
                    .map(OcssElectiveCourses::getStudentId)
                    .toArray(Long[]::new);

            return studentMapper.selectOcssStudentByIds(sids);
        }


        return new ArrayList<>();
    }
}
